package com.snbc.Io;

import java.io.*;

/**
 * @Classname DataStream
 * @Description 使用数据流的writeUTF()和readUTF() 可以进行数据的格式化顺序读写
 * 如本例，通过DataOutputStream 向文件顺序写出 布尔值，整数和字符串。 然后再通过DataInputStream 顺序读入这些数据。
 * @Date 2019/9/28 21:47
 * @Created by Acer
 */
public class DataStream {
    /*
     * 要用DataInputStream 读取一个文件，这个文件必须是由DataOutputStream 写出的，
     * 否则会出现EOFException，因为DataOutputStream 在写出的时候会做一些特殊标记，只有DataInputStream 才能成功的读取。
     * */


    /**
     * 要求
     * 第一种方式： 使用缓存流把两个数字以字符串的形式写到文件里，
     * 再用缓存流以字符串的形式读取出来，然后转换为两个数字。
     * 注： 两个数字之间要有分隔符用于区分这两个数字。
     * 比如数字是31和15，如果不使用分隔符，那么就是3115，读取出来就无法识别到底是哪两个数字。
     * 使用分隔符31@15能解决这个问题。
     * <p>
     * 第二种方式： 使用数据流DataOutputStream向文件连续写入两个数字，
     * 然后用DataInpuStream连续读取两个数字
     */
    static int a = 25, b = 20;

    public static void main(String[] args) {
        //write();
        // read();
        File file = new File("F:\\123444mmm\\12dad3.txt");
        //method1(file);
        method2(file);
    }

    /*第二种方式
     *使用数据流DataOutputStream向文件连续写入两个数字，然后用DataInpuStream连续读取两个数字
     */
    private static void method2(File file) {
        try (FileOutputStream fos = new FileOutputStream(file);
             DataOutputStream dos = new DataOutputStream(fos);
             FileInputStream fis = new FileInputStream(file);
             DataInputStream dis = new DataInputStream(fis)
        ) {
            //写入
            dos.writeInt(a);
            dos.writeInt(b);
            //读取
            System.out.println(dis.readInt());
            System.out.println(dis.readInt());
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    //第一种方式
    private static void method1(File file) {
        try (FileWriter fw = new FileWriter(file);//在try 同一创建对象，这里创建后，可以省区关闭流的步骤 ，jdk7 新特性
             PrintWriter pw = new PrintWriter(fw);
             FileReader fr = new FileReader(file);
             BufferedReader br = new BufferedReader(fr)) {
            pw.print(a + "@" + b);//缓存输出流写入 25@20
            pw.flush();//缓存区未满直接写入
            String line = "";
            //输入流读取文件中的内容
            while ((line = br.readLine()) != null) {
                String[] fenge = line.split("@");//以@为分隔符，把内容分隔成几个部分 25 20
                System.out.println(fenge[0] + " " + fenge[1]);//打印
            }

        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    private static void read() {
        File f = new File("F:\\123444mmm\\123.txt");
        try (
                FileInputStream fis = new FileInputStream(f);
                DataInputStream dis = new DataInputStream(fis)
        ) {
            boolean b = dis.readBoolean();
            int i = dis.readInt();
            String str = dis.readUTF();

            System.out.println("读取到布尔值:" + b);
            System.out.println("读取到整数:" + i);
            System.out.println("读取到字符串:" + str);

        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    private static void write() {
        File f = new File("F:\\123444mmm\\123.txt");
        try (
                FileOutputStream fos = new FileOutputStream(f);
                DataOutputStream dos = new DataOutputStream(fos)
        ) {
            dos.writeBoolean(true);
            dos.writeInt(300);
            dos.writeUTF("123 this is gareen");
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}